package com.atguigu.springcloud.controller;

import com.atguigu.springcloud.service.PaymentHystrixService;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author 赵雨强
 * @create 2021/8/8 17:07
 * @description 控制层
 * @DefaultProperties(defaultFallback = "paymentInfo_Global_FallbackMethod"),
 * 全局的服务尝试和异常处理办法
 *
 *
 * 在服务测的服务降级方法：
 * 方法一：为每个方法都配备服务降级方法，这样导致的后果是代码的冗余和膨胀
 * 方法二：制定全局的fallback，这样就不用每个反法都有对应的降级方法了，需要定制的，就参照方法一，其余的使用全局方法
 * 方法三：对使用openfeign调用的所有接口实现一个fallback类，达到解耦的目的
 */
@RestController
@Slf4j
//@DefaultProperties(defaultFallback = "paymentInfo_Global_FallbackMethod") //1.全局服务降级
public class PaymentHystrixController {
    @Resource
    private PaymentHystrixService paymentHystrixService;

    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id){
        String result = paymentHystrixService.paymentInfo_OK(id);
        return  result;
    }

    //@HystrixCommand(fallbackMethod = "paymentInfo_TimeoutFallbackMethod",commandProperties = {
    //        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000")
    //})                 //4.如果是特殊方法，使用特殊的服务降级方法，如果不需要特殊的，就使用3中默认的全局服务降级配置

    //@HystrixCommand   //3.使用默认的的服务降级方法
    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    public String paymentInfo_Timeout(@PathVariable("id") Integer id){
        String result = paymentHystrixService.paymentInfo_Timeout(id);
        return  result;
    }

    /**
     * 超时和错误处理的方法
     * <h1>注意：方法参数与发生异常的方法保持一致。</h1>
     * @return
     */
    public String paymentInfo_TimeoutFallbackMethod(Integer id) {
        return "/(ToT)/我是消费者80，调用8001支付系统繁忙，请10秒钟后重新尝试、\t";
    }


    /**
     * 下面是全局fallback方法 //2.全局服务降级默认方法
     * @return
     */
    public String paymentInfo_Global_FallbackMethod() {
        return "Global异常处理信息，请稍后再试， /(ToT)/";
    }



}
